package com.test.javafaq_portal.service.impl;

import com.test.javafaq_portal.entity.Tag;
import com.test.javafaq_portal.mapper.TagMapper;
import com.test.javafaq_portal.service.ITagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author test.com
 * @since 2025-04-11
 */
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagService {

    //声明一个集合，保存数据库中所有标签，当作缓存，调高代码运行效率
    //CopyOnWriteArrayList是线程安全的ArrayList对象

    private final List<Tag> tags = new CopyOnWriteArrayList<>();
    private final Map<String,Tag> name2TagMap = new ConcurrentHashMap<>();

    @Override
    public List<Tag> getTags() {
        if(tags.isEmpty()){
            //如果tags是空的，表示第一次访问，先加锁不让其他线程同时访问
            synchronized (tags){
                //再次检查tags的非空，防止多个线程反复赋值
                if(tags.isEmpty()){
                    //mybatisplus提供了this.list()方法，查询数据库返回所有标签
                    List<Tag> ts = this.list();
                    //将ts中的所有标签存放到tags
                    tags.addAll(ts);
                    //为name2TagMap赋值
                    for (Tag t:tags) {
                        name2TagMap.put(t.getName(),t);
                    }
                }
            }
        }
        return tags;
    }

    @Override
    public Map<String, Tag> getName2TagMap() {
        if(name2TagMap.isEmpty()){//如果name2TagMap为空则调用 getTags();去为name2TagMap赋值
            getTags();
        }
        return name2TagMap;
    }
}
